import { ref, onMounted } from 'vue';
import Api from '@/api';

/**
 * 字典选项接口
 */
export interface DictOption {
  label: string;
  value: string | number;
  [key: string]: any;
}

/**
 * 根据字典类型编码获取字典选项
 * @param dictCode 字典类型编码
 * @param transform 自定义转换函数，可选
 * @returns 字典选项列表和加载状态
 */
export function useDictData(
  dictCode: string,
  transform?: (item: any) => DictOption
) {
  const dictOptions = ref<DictOption[]>([]);
  const loading = ref<boolean>(false);
  
  /**
   * 加载字典数据
   */
  const loadDict = async () => {
    loading.value = true;
    try {
      // 1. 获取所有字典类型
      const dictTypes = await Api.systemDictType.dictTypeGetAll();
      
      // 2. 找到目标字典类型
      const targetType = dictTypes.find(type => type.code === dictCode);
      
      if (!targetType) {
        console.warn(`字典类型 ${dictCode} 不存在`);
        return;
      }
      
      // 3. 获取该字典类型下的所有字典项
      const response = await Api.systemDictItem.dictItemList({
        typeId: targetType.id,
        pageSize: 100, // 设置足够大的页码保证获取全部数据
      });
      
      // 4. 处理返回的字典项数据
      if (response.items && response.items.length > 0) {
        if (transform) {
          // 使用自定义转换函数
          dictOptions.value = response.items.map(transform);
        } else {
          // 默认转换，避免属性重复
          dictOptions.value = response.items.map(item => {
            // 创建一个新对象，只保留需要的属性
            const { label, value, id, orderNo, status, remark } = item;
            return {
              label,
              value,
              id,
              orderNo,
              status,
              remark
            };
          });
        }
      }
    } catch (error) {
      console.error('加载字典数据失败:', error);
    } finally {
      loading.value = false;
    }
  };
  
  // 组件挂载时自动加载字典数据
  onMounted(() => {
    loadDict();
  });
  
  return {
    dictOptions,
    loading,
    refresh: loadDict
  };
}

/**
 * 根据字典类型编码获取字典选项（静态方法，用于非组件环境）
 * @param dictCode 字典类型编码
 * @returns Promise<DictOption[]> 字典选项列表
 */
export async function getDictOptions(dictCode: string): Promise<DictOption[]> {
  try {
    // 1. 获取所有字典类型
    const dictTypes = await Api.systemDictType.dictTypeGetAll();
    
    // 2. 找到目标字典类型
    const targetType = dictTypes.find(type => type.code === dictCode);
    
    if (!targetType) {
      console.warn(`字典类型 ${dictCode} 不存在`);
      return [];
    }
    
    // 3. 获取该字典类型下的所有字典项
    const response = await Api.systemDictItem.dictItemList({
      typeId: targetType.id,
      pageSize: 100, // 设置足够大的页码保证获取全部数据
    });
    
    // 4. 处理返回的字典项数据
    if (response.items && response.items.length > 0) {
      // 创建新对象，避免属性重复
      return response.items.map(item => {
        const { label, value, id, orderNo, status, remark } = item;
        return {
          label,
          value,
          id,
          orderNo,
          status,
          remark
        };
      });
    }
    
    return [];
  } catch (error) {
    console.error('加载字典数据失败:', error);
    return [];
  }
}

export default useDictData; 